using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AudioManager : MonoBehaviour
{
    public static AudioManager instance; // 单例模式实例

    [SerializeField] private float sfxMinimunDistance; // 音效最小距离
    [SerializeField] private AudioSource[] sfx; // 音效数组
    [SerializeField] private AudioSource[] bgm; // 背景音乐数组

    public bool playBgm; // 是否播放背景音乐
    private int bgmIndex; // 当前背景音乐索引

    private bool canPlaySFX;

    private void Awake()
    {
        if (instance != null)
        {
            Destroy(instance); // 如果实例已存在，销毁当前实例
        }
        else
        {
            instance = this; // 否则，将当前实例赋值给instance
        }
        Invoke("AllowSFX", 1f);
    }

    private void Update()
    {
        if (!playBgm)
        {
            StopAllBGM(); // 如果不播放背景音乐，停止所有背景音乐
        }
        else
        {
            if (!bgm[bgmIndex].isPlaying)
            {
                PlayBGM(bgmIndex); // 如果当前背景音乐未播放，播放背景音乐
            }
        }
    }

    #region playsfx
    public void PlaySFX(int _sfxIndex, Transform _source)
    {
        // if (sfx[_sfxIndex].isPlaying)
        // {
        //     return; // 如果音效正在播放，返回
        // }

        if (!canPlaySFX) return;

        Player player = PlayerManager.instance?.player;
        if (_source != null && Vector2.Distance(player.transform.position, _source.position) > sfxMinimunDistance)
        {
            return; // 如果音效源距离玩家超过最小距离，返回
        }

        if (_sfxIndex < sfx.Length)
        {
            sfx[_sfxIndex].pitch = Random.Range(1f, 1.5f); // 随机设置音效音调
            sfx[_sfxIndex].Play(); // 播放音效
        }
    }
    
    public void StopSFX(int _sfxIndex) => sfx[_sfxIndex].Stop(); // 停止音效

    #endregion

    #region playbgm
    public void PlayRandomBGM()
    {
        bgmIndex = Random.Range(0, bgm.Length); // 随机选择背景音乐
        PlayBGM(bgmIndex); // 播放背景音乐
    }

    public void PlayBGM(int _bgmIndex)
    {
        bgmIndex = _bgmIndex; // 设置当前背景音乐索引
        StopAllBGM(); // 停止所有背景音乐
        bgm[bgmIndex].Play(); // 播放背景音乐
    }

    public void StopAllBGM()
    {
        for (int i = 0; i < bgm.Length; i++)
        {
            bgm[i].Stop(); // 停止所有背景音乐
        }
    }

    #endregion

    private void AllowSFX()
    {
        canPlaySFX = true;
    }

    public void StopSFXWithTime(int _index)
    {
        // 启动协程来逐渐减少音效音量
        StartCoroutine(DecreaseVolume(sfx[_index]));
    }

    private IEnumerator DecreaseVolume(AudioSource _audio)
    {
        float defaultVolume = _audio.volume; // 保存初始音量
        while (_audio.volume > .1f) // 当音量大于0.1时
        {
            _audio.volume -= _audio.volume * .2f; // 以20%的比例减少音量
            yield return new WaitForSeconds(.5f); // 等待0.5秒
            if (_audio.volume <= .1f) // 如果音量小于等于0.1
            {
                _audio.Stop(); // 停止音效
                _audio.volume = defaultVolume; // 恢复初始音量
                break; // 退出循环
            }
        }
    }

}